package com.briup.day15;



/**
 * @author ThinkBook
 */
public class Test01 {
    public static int k = 0;//初始化
    public static Test01 t1 = new Test01("t1");//初始化【3】
    //去执行构造方法
    public static Test01 t2 = new Test01("t2");//初始化【6】
    public static int i = print("i");//初始化【7】
    public static int n = 99;//初始化【8】
    public int j = print("j");//【1】【4】
    {
        print("构造块");//【2】【5】
    }
    static {
        print("静态块");//【9】
    }
    public Test01(String str) {
        System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
        ++n;
        ++i;
    }
    public static int print(String str) {
        System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
        ++n;
        return ++i;
    }
    public static void main(String[] args) {
    }
}

/*
* 1、先是找到main方法；然后加载父类，为父类的所有成员变量赋初值0.
输出：“父类的静态构造块”
2、父类加载完毕，加载子类。同样赋初值0.然后执行它遇到的第一个static。但是在为其初始化过程中遇到了对象的实例化，所以要暂停加载，先实例化。
3、然后实例化子类，先调用父类的无参构造。而父类会把构造代码块放到每个构造函数的最前面。所以会先执行父类的构造块，然后父类的构造函数（构造函数只有在调用时才会执行）。所以，会先输出“父类构造块”再输出“父类构造函数”而“父类重载的构造方法不会执行”因为没有人调用它。
4、执行完父类的构造函数后会执行子类的非静态变量的初始化，非静态方法的声明，构造块的执行。
所以会执行print（“j”）。因为类没有加载完，所以静态变量现在还是0.输出结果：“1：j
i=0，n=0”。执行构造块，输出“2:构造块 i=1 n=1”。执行构造函数输出：“3:t1 i=2 n=2”
5、实例化t2，重复第三步和第四步。输出：
“父类的构造块
父类的构造函数
4:j i=3 n=3
5:构造块 i=4 n=4
6:t2 i=5 n=5”
6、静态变量t1和t2初始化完成，继续加载初始化i.输出：“7:i i=6 n=6”并返回i=7.
7、初始化n=99.
8、执行静态块。输出“8:静态块 i=7 n=99”
* */
